package site.wanjiahao.client;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;

/**
 * 抽象文件上传类，定义公共方法
 */
public abstract class AbstractHttp {

    // 原生http请求
    private HttpURLConnection connection = null;

    private static final String CONTENT_TYPE = "Content-Type";

    // 请求方法
    public String method;

    // 请求url
    public String url;

    // 响应的类型
    public String contextType;

    // 是否允许HTTP输出
    public boolean doOutPut = true;

    // 是否允许HTTP输入
    public boolean doIntPut = true;

    // 使用缓存
    public boolean useCaches = false;

    // 连接超时时间
    public int timeout = 5000;

    // 所有处理的入口， 一切类都是调用此方法开始建立连接，发送数据，处理响应，关闭连接 (模板方法)
    public void process() throws IOException {

        // 初始化连接请求
        initConnect();

        // 子类实现具体逻辑
        handler();

        // 关闭连接
        connection.disconnect();
    }

    // 模板方法
    protected abstract void handler() throws IOException;

    // 获取响应头字段
    protected String getHeaderField(String value) {
        return connection.getHeaderField(value);
    }

    // 获取响应流
    protected OutputStream getOutputStream() throws IOException {
        return connection.getOutputStream();
    }

    // 获取输入流，准备发送数据
    protected InputStream getInputStream() throws IOException {
        if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) {
            return connection.getInputStream();
        }
        return null;
    }

    private void initConnect() throws IOException {
        URL urlConn = new URL(url);
        // 设置连接的基本属性
        connection = (HttpURLConnection) urlConn.openConnection();
        connection.setConnectTimeout(timeout);
        connection.setRequestMethod(method);
        connection.setRequestProperty(CONTENT_TYPE, contextType);
        connection.setDoOutput(doOutPut);
        connection.setDoInput(doIntPut);
        connection.setUseCaches(useCaches);
    }

}
